17 - 2.5.1 C-Kurzeinführung: Felder als Funktionsparameter [ID:14990]
50 von 123 angezeigt

Gerade wenn man sich die Übergabe von Parametern an Funktionen anschaut, dann wird der Zusammenhang

zwischen Zeigern und Feldern ganz besonders deutlich. Man kann ganze Zeiger in C nämlich

gar nicht an Funktionen übergeben, zumindest man kann sie nicht bei Value übergeben, so wie

normale Parameter an Funktionen übergeben werden. Denn wenn man einer Funktion einen

Feldnamen als Parameter übergibt, dieser Feldname ist ein Zeiger auf den Anfang des

Feldes, dann wird genau dieser Zeiger bei Value übergeben, aber das ist ja nur der

Zeiger auf das erste Element des Feldes und die Funktion bekommt einfach eine Kopie dieses

Zeigers und bekommt damit eine Kopie auf den Anfang des Feldes. Und über ihren formalen

Parameter, diese Kopie des Zeigers, kann dann die Funktion in gleicher Weise wie der Aufrufer

auf die Feldelemente zugreifen und diese natürlich dann auch verändern. Das heißt

de facto haben wir damit einen Kolberreferenz, wenn man ein Feld übergibt und keinen Kolbervalue.

Zumindest wenn man das Feld betrachtet. Wenn man natürlich nur den Feldnamen als Zeiger

auf den Beginn des Feldes betrachtet, dann haben wir von dem natürlich einen Kolbervalue.

Bei der Deklaration des formalen Parameters in der Funktion wird die Feldgröße dann

weggelassen. Denn die Feldgröße ergibt sich automatisch durch den tatsächlichen Parameter,

also durch die Größe des Feldes, auf das der Zeiger übergeben wird. Und die Funktion kennt

die Feldgröße damit erstmal nicht. Sie können also eine Funktion, die ein Feld zum Beispiel auf

Integers erwartet, de facto unterschiedlich große Felder übergeben. Und irgendwoher muss die Funktion

natürlich dann wissen, wie groß das tatsächlich übergebene Feld ist. Und das können sie eigentlich

nur ihr mitteilen, indem sie einen weiteren Integerparameter haben, indem sie an die Funktion

eben die Feldgröße übergeben. Die einzige Art von Feldern, wo das ein bisschen anders ist,

sind Charakterfelder. Denn ein Charakterfeld enthält ja im Normalfall einen String und die

Strings, diese Zeichenketten werden per Konvention ja durch diesen Nullcharakter abgeschlossen. Und

sie können dann natürlich innerhalb der Funktion einfach so lange über das Feld drüber laufen,

bis sie diesen Nullcharakter finden. Und dann wissen sie, an dieser Stelle ist der Inhalt des

Feldes zu Ende. Das heißt nicht, dass das Feld nicht eventuell größer ist und wenn sie da was

reinschreiben wollten, dass da nicht noch weitere Bytes in diesem Feld verfügbar wären. Aber sie

können zumindest, wenn sie ein gefülltes Charakterfeld bekommen, anhand des Inhalts

rausbekommen, wie viele gültige Zeichen da drin stehen. Bei einem Integerfeld ist das natürlich

nicht so, denn wenn sie ein Integerfeld haben, es gibt keinen abschließenden Integerwert, an dem

sie erkennen können. Das ist jetzt quasi der letzte in dem Feld. Schauen wir uns jetzt mal die

Deklaration der Funktionsparameter an. Vorab vielleicht noch der Hinweis, wenn ein Feldparameter

als Konst deklariert wird, dann können die Feldelemente innerhalb der Funktion nicht verändert

werden. Das heißt also nicht, dass der Zeiger auf dem Beginn des Feldes konstant ist, sondern

dass die Werte, auf die dieser Zeiger zeigt, dass der Feld Inhalt, dass der konstant sein soll und

dass der Funktion damit verboten ist, über diesen Zeiger modifizierend auf das Feld zuzugreifen.

Ich habe jetzt hier ein paar Beispiele, wo ich Funktionsaufruf und Deklaration der formalen

Parameter eben am Beispiel eines Integerfeldes beschreibe. Wir haben also zwei Integerwerte a und b

und wir haben ein Feld der Größe von 20. Jetzt kann ich eine Funktion aufrufen, der übergebe ich

diese beiden Integerwerte a und b und diesen Zeigerfeld. Die Funktionsdeklaration dieser Funktion

func sieht jetzt so aus. Wir haben als ersten Parameter dieses P1, Integerparameter 1. Dann

haben wir dieses Feld, Integerparameter 2. Die Feldgröße lasse ich jetzt hier weg, denn ich will ja

keinen Speicherplatz anlegen dafür. Die Feldgröße ergibt sich ja aus der Größe des Feldes, das ich

hier übergeben habe, in dem Fall eben dieses 20 Integergroße Feld. Dann habe ich den Parameter 3.

Diese Funktionsdefinition könnten Sie genauso gut auch so hinschreiben, wie es hier steht.

Integer P1 und dann Integer Stern P2 und Integer P3. Integer Stern P2 ist an dieser Stelle genau

dasselbe wie das hier, denn die Funktion bekommt ja eine Kopie des Zeigers übergeben. Und nachdem

das originale Feld zwar eine Konstante war, also der Feldname Feld hier oben, das ist eine Konstante,

aber wenn von dieser Konstanten eine Kopie gezogen wird für die Funktion, für den formalen Parameter,

dann ist das tatsächlich ein variabler Zeiger. Und egal ob Sie es jetzt so hinschreiben mit Stern

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

00:13:29 Min

Aufnahmedatum

2020-05-05

Hochgeladen am

2020-05-05 15:36:39

Sprache

de-DE

Tags

module programmstruktur Variablen Datentypen Preprozessor Gültigkeit
Einbetten
Wordpress FAU Plugin
iFrame
Teilen